
from database.platform_repo import select_all_model_and_platform, select_model_and_platform_by_model_name
from database.user_evaluation_repo import get_user_evaluation_by_user_id_and_llm_id, insert_user_evaluation


from models.user_evaluation import UserEvaluation
from models.analyse_info import AnalyseInfo

from utils.date_format import is_over_one_month

from ai.get_result import get_ai_result


"""
获取所有模型的结果：
1.从数据库中查找可用的模型和平台
2.判断当前模型是否之前对这个用户进行过判别
2.1 如果进行过判别且没有超过一个月，直接使用数据库的数据
2.2 否则需要重新判断
3.将数据传递给对应的模型进行判别
4.将结果存入数据库
5.返回结果
"""
def get_all_model_result(user_id, data):
    all_model_data = select_all_model_and_platform()
    result = []
    for item in all_model_data:
        res = get_user_evaluation_by_user_id_and_llm_id(user_id, item['llm_id'])
        if res and not is_over_one_month(res['update_time']):
            # res 和 item中整合，重复的key取res的
            obj = {**res, **item}
            analyse_info = AnalyseInfo(**obj)
            result.append(analyse_info.json())
            continue
        
        
        res = get_ai_result(data, item)
        if res == None:
            continue
        res['user_id'] = user_id
        res['llm_id'] = item['llm_id']
        # 保留分析数据
        user_evaluation = UserEvaluation(**res)
        insert_user_evaluation(user_evaluation)
        
        analyse_info = AnalyseInfo(**res, **item)
        result.append(analyse_info.json())
    return result


def get_one_model_result(user_id, model_name, data):
    # 1.找到模型和对应的名称以及平台名称
    item = select_model_and_platform_by_model_name(model_name)
    if not item:
        return None
    # 2.根据llm_id和user_id判断是否之前进行过判别
    res = get_user_evaluation_by_user_id_and_llm_id(user_id, item['llm_id'])
    if res and not is_over_one_month(res['update_time']):
        obj = {**res, **item}
        analyse_info = AnalyseInfo(**obj)
        return analyse_info.json()
    
    # 3.将数据传递给对应的模型进行判别
    ai_result = get_ai_result(data, item)
    if not ai_result:
        return None
    
    # 保留分析数据
    user_evaluation = UserEvaluation(user_id, **item, **ai_result)
    insert_user_evaluation(user_evaluation)
    
    analyse_info = AnalyseInfo(user_id, **ai_result, **item)
    
    return analyse_info.json()
    



